home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 011-020 / amok12 / fischertechnik / interface / interface.mod < prev    next >
Text File  |  1993-11-04  |  4KB  |  177 lines

  1. (**********************************************************************
  2.  
  3.     :Program.       Interface.mod
  4.     :Author.        Norbert Klapczynski
  5.     :Address.    Kochelseestr. 9, D8900 Augsburg 1
  6.     :Phone.      0821/662825
  7.     :shortcut.      [kla]
  8.     :Version.       1.0   
  9.     :Date.          29.11.88
  10.     :Copyright.  Public Domain (siehe ReadMe)
  11.     :Language.      Modula-II
  12.     :Translator. M2Amiga AMSoft
  13.     :Update     
  14.     :Contents.     Easy controling of Fischertechnik at parallelport
  15.     :Remark.     Copy and use it but please leave my name in, thanks.
  16.     
  17. **********************************************************************)
  18.  
  19. IMPLEMENTATION MODULE Interface;
  20.  
  21.  
  22. FROM Arts   IMPORT  TermProcedure,Assert;
  23. FROM Exec   IMPORT  Enable, Disable;
  24. FROM SYSTEM IMPORT  ADR;
  25.  
  26. TYPE  Channels   = ( LOut,LIn,DOut,Clk,TX,TY,unused1,unused2 );
  27.       CSet       = SET OF Channels;
  28.       Bits       = ( D0,D1,D2,D3,D4,D5,D6,D7 );
  29.       BSet       = SET OF Bits;
  30.       
  31.             
  32. CONST RuheMaske    = CSet { TX,TY };
  33.       LoadOutMaske = CSet { TX,TY,LOut };
  34.       LoadInMaske  = CSet { TX,TY,LIn };
  35.       
  36. VAR Direction [0BFE301H] : CSet;
  37.     Value     [0BFE101H] : CSet;
  38.     BusyByte  [0BFD000H] : BSet;
  39.          
  40.     NextVal              : BSet;
  41.     
  42.  
  43. (*------------------*)
  44.  
  45. PROCEDURE Write();
  46. VAR i     : Bits;
  47.     Maske : CSet;
  48. BEGIN
  49.   FOR i:=D7 TO D0 BY -1 DO
  50.      Maske:=RuheMaske;
  51.      IF i IN NextVal THEN
  52.        INCL(Maske,DOut);
  53.      END;
  54.      Value:=Maske;
  55.      INCL(Maske,Clk);
  56.      Value:=Maske;
  57.   END;
  58.   Value:=LoadOutMaske;
  59. END Write;
  60.  
  61. (*------------------*)
  62.  
  63. PROCEDURE Read() : ESet;
  64. VAR ReadVal : ESet;
  65.     Maske   : CSet;
  66.     i       : Input;
  67.  
  68. BEGIN
  69.   ReadVal:=ESet{};
  70.   Maske:=LoadInMaske;
  71.   Value:=Maske;
  72.   INCL(Maske,Clk);
  73.   Value:=Maske;
  74.   FOR i:=E8 TO E1 BY -1 DO
  75.      IF NOT(D0 IN BusyByte) THEN
  76.        INCL(ReadVal,i);
  77.      END;
  78.      Maske:=RuheMaske;
  79.      Value:=Maske;
  80.      INCL(Maske,Clk);
  81.      Value:=Maske;
  82.   END;
  83.   RETURN ReadVal;
  84. END Read;
  85.  
  86. (*------------------*)
  87.  
  88. PROCEDURE PrepareM( m:Motor; wie:Richtung );
  89. VAR set,reset: BSet;
  90.  
  91. BEGIN
  92.     CASE m OF
  93.        M1:  reset:= BSet {D0,D1};
  94.      | M2:  reset:= BSet {D2,D3};
  95.      | M3:  reset:= BSet {D4,D5};
  96.      | M4:  reset:= BSet {D6,D7};
  97.     END;
  98.     NextVal:= NextVal-reset; (* ohne *)
  99.     CASE wie OF
  100.         Aus        : set:= BSet {};
  101.       | Ein,Rechts : set:= BSet {D1,D3,D5,D7};
  102.       | Links      : set:= BSet {D0,D2,D4,D6};   
  103.       | Aus2       : set:= BSet {D0..D7};
  104.     END;
  105.     set:= set * reset;       (* Schnittmenge *);
  106.     NextVal:= NextVal + set; (* Vereinigungsmenge *)  
  107. END PrepareM;
  108.  
  109. (*------------------*)
  110.  
  111. PROCEDURE M( m: Motor; wie: Richtung);
  112. BEGIN
  113.   PrepareM(m,wie);
  114.   Write();
  115. END M;
  116.  
  117. (*------------------*)
  118.  
  119. PROCEDURE E( e: Input ): BOOLEAN;
  120. VAR read: ESet;
  121. BEGIN
  122.   read:=Read();
  123.   RETURN e IN read;
  124. END E;
  125.  
  126. (*------------------*)
  127.  
  128. PROCEDURE Pot (p: PotType): CARDINAL;
  129. VAR    Maske : CSet;
  130.        count : CARDINAL;
  131. BEGIN
  132.   CASE p OF
  133.       x : Maske:= CSet {TX};
  134.     | y : Maske:= CSet {TY};
  135.   END;
  136.   Value:= Maske;
  137.   count:=0;
  138.   Maske:= RuheMaske;
  139.   INCL(Maske,Clk);
  140.   Disable();
  141.   Value:= Maske;
  142.   LOOP
  143.     IF D0 IN BusyByte THEN
  144.        EXIT;
  145.     END;   
  146.     INC(count);     
  147.   END; 
  148.   Enable();
  149.   RETURN count;
  150. END Pot;
  151.  
  152. (*------------------*)
  153.  
  154. PROCEDURE Init();
  155. BEGIN
  156.   NextVal := BSet{};
  157.   Write();
  158. END Init;                                          
  159.  
  160. (*------------------*)
  161.  
  162. PROCEDURE Exit();
  163. BEGIN
  164.   Direction:=CSet{};
  165. END Exit;
  166.  
  167.  
  168. BEGIN
  169.   Assert( (Direction=CSet{}),ADR("Parallelport schon benutzt")); 
  170.   Direction:= CSet { LOut,LIn,DOut,Clk,TX,TY };
  171.   Init();
  172.   TermProcedure( Exit );
  173.   TermProcedure( Init ); (* Wird noch vor Exit ausgeführt *)
  174. END Interface.
  175.  
  176.  
  177.